package ww;

import excercise.J21_publicClass;

public class J21_AccessModifier {

	// 캡슐화encapsulation와 접근 제어
	// OOP의 원칙에서 캡슐화는
	// 객체의 일부를 보호하고
	// 노출해도 상관없는 부분을 노출했을 떄에는
	// "안전" 해야 한다는 매커니즘
	// 예를 들어 , 텔레비전은 캡슐화의 좋은 예임
	// 텔레비젼의 수많은 부품들을 케이스 안에 놓아둠
	// 클래스 개발자는 변수와 메서드들을 외부로 부터 감춰두어야 함
	// 자바는 접근 제어를 통해 캡슐화를 지워함
	// 접근 제어의 종류에는 4가지가 존재
	// private : 자신만 접근 가능, 그외는 접근 불가
	// protected : 상속관계에 클래스만 접근가능
	// public : 어디서나 접근가능함을 의미
	// default : 기본 패키지 내 클래스들끼리만  접근가능
	
	// 클래스에 적용 :  public, default만 사용가능
	// 멤버변수에 적용 : public, pretected, private , default
	// 메서드에 적용 : public, pretected, private , default
	
	// 결론 
	// OOP의 캡슐화 원칙의 따라 클래스의 멤버변수들은 무조건 private 선언
	// 클래스의 메서드들은 외부에 노추라려면 public으로 선언 , 그외의 경우에는
	// protected로 선언 
	
	public static void main(String[] args) {
		// Defualt 클래스 부러오기
		// defualt 패키지에 선언된 클래스는
		// 같은 패키지내에 존재하는 클래스만이 접근가능
		// 즉, ww 패키지에서 defualt 패키지에 접근이 안됨
		// J21_PublicClass pdc = new J21_DefaultClass();
		 
		// J21_PublicClass 클래스가 public 이라 하더라도
		// defualt 패키지 내에 있으므로 접근 불가
		// J21_PublicClass pdc = new J21_DefaultClass();
		
		// J21_PublicClass 클래스는 public 이기 떄문에
		// 어떤 패키지라도 접근 가능
		J22_PublicClass pbc = new J22_PublicClass();
		J21_publicClass pbc1 = new J21_publicClass();
		excercise.J21_publicClass pp2 = new excercise.J21_publicClass(); 
		
		// 클래스 멤버변수에 접근
		// 같은 패키지내 클래스의 멤버 변수 접근 pbc
		pbc.defautval = 1;
		pbc.publicval = 2;
		//pbc.privateval = 3;
		
		// 다른 패키지내 클래스의 멤버변수 접근 pbc1
		//pbc1.defautval = 1;
		pbc1.publicval = 2;
		//pbc1.privateval = 3;
		
		// 클래스 메서드에 접근
		// 같은 패키지내 클래스의 메서드 접근 pbc
		pbc.publicmethod();
		//pbc.privatemethod();
		pbc.defautmethod();
		// 다른 패키지내 클래스의 메서드 접근 pbc1
		pbc1.publicmethod();
		//pbc1.privatemethod();
		//pbc1.defautmehod();
	}

}
